<?php

/**
 *
 * @package php.ui.winbinder
 */


/**
 * 윈도우에서 사용되는 dll 을 실행하기 위한 클래스 
 *
 * 
 * @package php.ui.winbinder
 */
class WBLibrary extends PObject { 
	
	private $_library = '';
	private static $_instance = null;

	/**
	 * 생성자 
	 *
	 * 
	 * @param string $library 시스템 또는 로드될 라이브러리(dll) 이름 
	 */
	public function __construct($library) { 
		$this->_library = $library;

		$this->load();
	}

	/**
	 * $_library 에 등록된 라이브러리를 로드한다. 
	 * 라이브러리 인스턴스는 한번만 로드된다. 
	 *
	 */
	public function load() { 
		if ($GLOBALS['__library_list'][$this->_library]) { 
			$this->_instance = $GLOBALS['__library_list'][$this->_library];
		} else {
			$this->_instance = wb_load_library($this->_library);

			$GLOBALS['__library_list'][$this->_library] = $this->_instance;
		}
	
	}

	/**
	 * 인스턴스에서 함수 포인터 가지고 오기 
	 * 
	 * @param string $func 실행될 함수 이름 
	 * @return int 함수 포인터 
	 */ 
	public function getFunction($func) { 
		if ($GLOBALS['__library_function_list'][$func]) { 
			return $GLOBALS['__library_function_list'][$func];
		} else {
			$instance = wb_get_function_address($func, $this->getInstance());

			$GLOBALS['__library_function_list'][$func] = $instance;
			
			return $instance;
		}		
	}

	/**
	 * 주어진 함수포인터로 함수 실행 
	 *
	 * @param string $func 실행될 함수 이름 
	 * @param array $args 매개변수 리스트 
	 * @return mixed 함수 실행된 리턴값 
	 */ 
	public function call($func, $args = array()) {
		return wb_call_function($this->getFunction($func), $args);
	}

	/**
	 * load된 라이브러리 인스턴스 가져오기 
	 *
	 * @return int 인스턴스 포인터 
	 */ 
	public function getInstance() { 
		return $this->_instance;
	}

	/**
	 * 로드된 라이브러리명 가져오기 
	 *
	 * @return string 라이브러리명 
	 */
	public function getLibrary() { 
		return $this->_library;
	}

	/**
	 * 변수 값의 실제 메모리 주소(포인터) 얻어오기 
	 *
	 * @param string|int|bool|double $data 데이타 
	 * @return int 메모리 주소 
	 */
	public static function getAddress($data) { 
		return wb_get_address($data);
	}

	/**
	 * 메모리 주소로부터 데이타 얻어오기 
	 * 
	 * @param int $ptr 메모리 주소 
	 * @param int $bytes 가져올 바이트 수 
	 * @return mixed 메모리 값 
	 */
	public static function get($ptr, $bytes = 0) {
		return wb_peek($ptr, $bytes);
	}

	/** 
	 * 메모리 주소에 값 설정 하기 
	 * 
	 * @param int $ptr 메모리 주소 
	 * @param string $contents 설정될 문자열 
	 * @param int $bytes 설정할 바이트 수, 0은 전체 
	 *
	 */
	public static function set($ptr, $contents, $bytes = 0){
		return wb_poke($ptr, $contents, $bytes);
	}

	/**
	 * 함수 실행 유틸리티 메소드 
	 * 
	 * 함수를 실행하는 과정 전체를 하나의 메소드로 실행한다. 
	 *
	 * @param string $library 라이브러리명
	 * @param string $func 함수명 
	 * @param array &$args 매개변수 리스트 
	 * @return mixed 함수실행 결과 
	 */
	public static function run($library, $func, $args = array()) { 
		$lib = new WBLibrary($library);
		return $lib->call($func, $args);
	}

	/**
	 * 객체에 메세지 전송 
	 * 
	 * @param hwnd $wbobject
	 * @param int $message
	 * @param int $wparam
	 * @param int $lparam
	 * @return bool
	 */
	public static function send($wbobject, $message, $wparam, $lparam) { 
		return wb_send_message($wbobject, $message, $wparam, $lparam);
	}
}

?>